package com.common.util;

import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.*;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.net.MalformedURLException;
import java.util.Map;

/**
 * word、pdf处理工具类
 */
public class WordPDFUtil {

    protected static Logger logger = LoggerFactory.getLogger(WordPDFUtil.class);

    /**
     * 获取破解码文件内容
     */
    public static boolean getLicense() throws IOException {
        boolean result = false;
        InputStream is = null;
        try {
            //  license.xml应放在..\WebRoot\WEB-INF\classes路径下
            is = WordPDFUtil.class.getClassLoader().getResourceAsStream("static/license.xml");
            License license = new License();
            license.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != is) is.close();
        }
        return result;
    }

    /**
     * 通过模板导出word格式文件
     *
     * @param dataMap      导出数据
     * @param templateName 模板名称
     * @param path         导出word的路径以及文件名称
     */
    public static void exportWord(Map<String, Object> dataMap, String templateName, String path) {
        try {
            // 验证License 若不验证则转化出的pdf文档会有水印产生
            if (!getLicense()) {
                return;
            }
            //Configuration 用于读取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");
            //指定路径（根据某个类的相对路径指定）
            configuration.setClassForTemplateLoading(WordPDFUtil.class, "/template");
            //输出文档路径及名称
            File outFile = new File(path);
            FileOutputStream os = new FileOutputStream(outFile);
            //以utf-8的编码读取ftl文件
            Template template = configuration.getTemplate(templateName, "utf-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            template.process(dataMap, out);
            //导出成word时，\n换行替换成 <w:br/> 标签，不起作用，无法换行，所以用Document保存word
            Document doc = new Document(path);
            doc.save(os, SaveFormat.DOC);
            out.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * word转pdf文件
     *
     * @param Address    原文件地址
     * @param pdfAddress 保存的pdf文件地址
     */
    public static void wordConvertPdf(String Address, String pdfAddress) throws IOException {
        // 验证License 若不验证则转化出的pdf文档会有水印产生
        if (!getLicense()) {
            return;
        }
        FileOutputStream os = null;
        //判断是否windows系统，Linux要读取字体，否则pdf字体为方格
        OsInfo osInfo = SystemUtil.getOsInfo();
        if (osInfo.isLinux()) {
            String path = WordPDFUtil.class.getClassLoader().getResource("static/simsun.ttc").getPath();
            FontSettings.getDefaultInstance().setFontsFolder(path, true);
        }
        try {
            // 新建一个空白pdf文档
            File file = new File(pdfAddress);
            os = new FileOutputStream(file);
            // Address是将要被转化的word文档
            Document doc = new Document(Address);
            // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            doc.save(os, SaveFormat.PDF);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != os)
                os.close();
        }
    }

    /**
     * @param htmlString      html字符串
     * @param path            生成pdf文件存储路径
     * @param chineseFontPath 中文字体存储路径
     */
    public static void htmlPDF(String htmlString, String path, String chineseFontPath) {
        OutputStream os = null;
        try {
            os = new FileOutputStream(path);
            ITextRenderer renderer = new ITextRenderer();
            //html字符串转换模式
            renderer.setDocumentFromString(htmlString);
            // 解决中文不显示问题
            ITextFontResolver fontResolver = renderer.getFontResolver();
            fontResolver.addFont(chineseFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            renderer.layout();
            renderer.createPDF(os);
        } catch (MalformedURLException e) {
            logger.warn(e.toString(), e);
        } catch (FileNotFoundException e) {
            logger.warn(e.toString(), e);
        } catch (DocumentException e) {
            logger.warn(e.toString(), e);
        } catch (IOException e) {
            logger.warn(e.toString(), e);
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    logger.warn(e.toString(), e);
                }
            }
        }
    }

    /**
     * pdf文件添加图片水印
     *
     * @param InPdfFile     要添加水印的pdf路径
     * @param outPdfFile    添加水印完成的pdf输入路径
     * @param markImagePath 添加图片水印的路径
     * @param imgWidth      添加水印X坐标：文件的四个角，左下方的角坐标为（0,0）
     * @param imgHeight     添加水印的Y坐标
     */
    public static void addPDFLogo(String InPdfFile, String outPdfFile, String markImagePath, int imgWidth, int imgHeight) throws IOException, DocumentException {
        System.out.println("========开始生成水印========>>>>>>" + InPdfFile);
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
        PdfContentByte under;
        PdfGState gs1 = new PdfGState();
        gs1.setFillOpacity(0.3f);// 透明度设置
        Image img = Image.getInstance(markImagePath);// 插入图片水印
        img.setAbsolutePosition(imgWidth, imgHeight);// 图片坐标
        img.setRotation(0);// 旋转 弧度
        img.setRotationDegrees(0);// 旋转 角度
        //img.scaleAbsolute(595, 842);// 自定义大小
        // img.scalePercent(50);//依照比例缩放

        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for (int i = 1; i <= pageSize; i++) {
            under = stamp.getUnderContent(i);// 水印在之前文本下
            // under = stamp.getOverContent(i);//水印在之前文本上
            under.setGState(gs1);// 图片水印 透明度
            under.addImage(img);// 图片水印
        }
        System.out.println("========完成水印生成========>>>>>>" + outPdfFile);
        stamp.close();// 关闭
        reader.close();
    }

    /**
     * pdf文件添加图片水印（可设置多个不同图片水印在不同位置）
     * @param InPdfFile     要添加水印的pdf路径
     * @param outPdfFile    添加水印完成的pdf输入路径
     * @param images        添加图片水印的路径，可以设置多个
     * @param positions     与图片水印对应的位置
     */
    public static void addPDFLogo(String InPdfFile, String outPdfFile, String [] images,String [] positions) throws IOException, DocumentException {
        System.out.println("========开始生成水印========>>>>>>" + InPdfFile);
        PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
        Rectangle cropBox = reader.getPageSize(1);// 获取pdf页面区域
        PdfContentByte under;
        PdfGState gs1 = new PdfGState();
        gs1.setFillOpacity(0.3f); // 透明度设置

        Image img = null;
        for (int i = 0; i < images.length; i++) {
            img = Image.getInstance(images[i]);// 插入图片水印
            String position = positions[i];
            switch (position){
                case "居中":
                    img.setAbsolutePosition((cropBox.getWidth() - img.getWidth()) / 2,(cropBox.getHeight() -img.getHeight()) / 2); // 居中
                    break;
                case "左上角":
                    img.setAbsolutePosition(0, cropBox.getHeight() - img.getHeight()); // 左上角
                    break;
                case "左下角":
                    img.setAbsolutePosition(0, 0); // 左下角
                    break;
                case "右上角":
                    img.setAbsolutePosition(cropBox.getWidth() - img.getWidth(),cropBox.getHeight() - img.getHeight()); // 右上角
                    break;
                case "右下角":
                    img.setAbsolutePosition(cropBox.getWidth() - img.getWidth(),0); // 右下角
                    break;
            }
            img.setRotation(0);// 旋转 弧度
            img.setRotationDegrees(0);// 旋转 角度

            int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
            for (int j = 1; j <= pageSize; j++) {
                under = stamp.getUnderContent(j); // 水印在之前文本下
                // under = stamp.getOverContent(i); //水印在之前文本上
                under.setGState(gs1); // 图片水印 透明度
                under.addImage(img); // 图片水印
            }
        }
        System.out.println("========完成水印生成========>>>>>>" + outPdfFile);
        stamp.close();// 关闭
        reader.close();
    }

}
